﻿#pragma once
#include "XyNet/Global.h"

namespace XyNet
{
	/// rpc数据流，用于网络字节传输
	/// int类型限制一次最多只能传输2G字节的数据，这类超大数据应该考虑分块传输
	class XYNET_API RpcDataStream : noncopyable
	{
	public:
		RpcDataStream();
		explicit RpcDataStream(const Bytes& body);

		/// 清空
		void clear();
		/// 交换
		void swap(RpcDataStream& stream);

		/// 获取数据，包含head和body
		const byte* getData() const;
		/// 获取数据长度
		int getDataSize() const;

		/// 获取head指针
		const byte* getHead() const;
		/// 获取head指针（可修改）
		byte* getHeadPtr();
		/// 获取head长度
		int getHeadSize() const;

		/// 获取body指针
		const byte* getBody() const;
		/// 获取body指针（可修改）
		byte* getBodyPtr();
		/// 获取body长度
		int getBodySize() const;
		/// 设置body
		void setBody(const Bytes& body);
		/// 根据head分配body空间，分配成功返回true，否则返回false
		bool allocateBodyByHead();

	private:
		/// 流数据，含head和body
		Bytes _data;
		/// head字节长度
		static const int _headSize;
	};
}